//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03

// <vector>

#include <cstddef>
#include <memory>
#include <vector>

#include "test_macros.h"

struct Incomplete;
template <class T>
struct Holder {
  T t;
};

template <class T, class AdlTrap = Holder<Incomplete>>
struct MyAlloc {
  using value_type = T;
  MyAlloc()        = default;
  template <class U>
  MyAlloc(const MyAlloc<U>&) {}
  T* allocate(std::size_t n) { return std::allocator<T>().allocate(n); }
  void deallocate(T* p, std::size_t n) { return std::allocator<T>().deallocate(p, n); }
};

int main(int, char**) {
  std::vector<bool, MyAlloc<bool>> vb;
  // std::fill_n triggers ADL because __bit_iterator has the container type as a template argument
  // std::vector<bool, MyAlloc<bool>> wb(100);

  std::vector<int, MyAlloc<int>> v;
  std::vector<int, MyAlloc<int>> w(100);
  v.push_back(1);
  v.insert(v.end(), 2);
  v.insert(v.end(), w.begin(), w.end());
  v.pop_back();
  v.erase(v.begin());
  v.erase(v.begin(), v.end());
#if TEST_STD_VER >= 14
  // TODO: vector::swap is not robust against ADL because we compare allocators, and that
  //       triggers ADL when looking up operator==.
  // v.swap(w);
#endif
  return 0;
}
